/*
Copyright (c) 2009, Young Digital Planet SA
All rights reserved.

* Redistribution and use in source and binary forms, with or without 
  modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice, this 
  list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice, 
  this list of conditions and the following disclaimer in the documentation 
  and/or other materials provided with the distribution.
* Neither the name of the Young Digital Planet SA nor the names of its 
  contributors may be used to endorse or promote products derived from this 
  software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
POSSIBILITY OF SUCH DAMAGE.
*/
package com.yauthor.module
{	
	import com.yauthor.feedback.IFeedbackProcessor;
	import com.yauthor.feedback.IFeedbackUpdater;
	
	import flash.events.IEventDispatcher;

	/**
	 * Fired when style properties change.
	 * 
	 * @eventType com.yauthor.module.events.StylePropertiesChangedEvent.STYLE_PROPERTIES_CHANGED
	 */
	[Event(name="stylePropertiesChanged",type="com.yauthor.module.events.StylePropertiesChangedEvent")]
	/**
	 * Interface for context of utopia modules.
	 * Holds data of modules hierarchy. Supplies info about styles and 
	 * can proccess feedbacks.
	 */
	public interface IModuleContext extends IEventDispatcher
	{
		/**
		 * Parent context of current context.
		 */
		function get parent():IModuleContext;
		
		/**
		 * Module for which context has been established.
		 */	
		function get module():IModule2;
		
		/**
		 * Feedback updater. Updates Feedback properties.
		 */
		function set feedbackUpdater(updater:IFeedbackUpdater):void;
		
		/**
		 * Feedback processor. Processes send feedback.
		 */
		function set feedbackProcessor(processor:IFeedbackProcessor):void;
		
		/**
		 * Sends feedback with properties in given object.
		 * @param properties properties of send feedback
		 * @param src source which sends feedback
		 */
		function sendFeedback(properties:Object, src:* = null):void;
		
		/**
		 * Gets style value for given property.
		 * @param propertyName name of property which value will be returned
		 * @return value of style property
		 */
		function getStyle(propertyName:String):*;
		
		/**
		 * Object holding styles.
		 * @return object containng pairs name to value of style
		 */
		function get currentStyle():Object;
		
		/**
		 * Create new mark anwser skin for this element.
		 */
		function createShowAnswersSkin():IMarkAnswerSkin;
		
		/**
		 * Create and initialize context for child module associated with
		 * given XML node. Newly created context is passed to child module.
		 */
		function createContext( child:IModule2, node:XML ):IModuleContext;
		/**
		 * Create and initialize context for child module not associated with
		 * existing node. To get ability for module to distinguish it's styles
		 * from parent module, it uses selector with pseudoElement postfix:
		 * <tt>parentElementName:pseudoElement</tt>.
		 */
		function createContextPseudoelement( child:IModule2, pseudoElement:String ):IModuleContext;
	}
}